﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Oracle.DataAccess.Client;
using System.Configuration;
using Entidades.Solicitud;
using System.Data;
using Entidades.Consultas.Personalizadas;

namespace Persistencia.Solicitud
{
    public class PerSolicitudSeguimiento : Persistencia.General.IPersistencia
    {
        public void Insertar(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            conexion.Open();

            comando = new OracleCommand("PKG_SOLICITUD_SEGUIMIENTO.insertSolicitudSeguimiento", conexion);
            comando.CommandType = System.Data.CommandType.StoredProcedure;

            try
            {
                OracleParameter parametro2 = new OracleParameter();
                parametro2.OracleDbType = OracleDbType.Varchar2;
                parametro2.Value = ((EntSolicitudSeguimiento)entidad).EnviarEmail.Trim();
                parametro2.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro2);

                OracleParameter parametro3 = new OracleParameter();
                parametro3.OracleDbType = OracleDbType.Varchar2;
                parametro3.Value = ((EntSolicitudSeguimiento)entidad).Comentarios;
                parametro3.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro3);

                OracleParameter parametro4 = new OracleParameter();
                parametro4.OracleDbType = OracleDbType.Varchar2;
                parametro4.Value = ((EntSolicitudSeguimiento)entidad).CveSolicitud;
                parametro4.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro4);

                comando.ExecuteNonQuery();
            }

            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje:  " + exc.Message);
                excepcion.Source = "PerSolicitudSeguimiento.Insertar";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje:  " + exc.Message);
                excepcion.Source = "PerSolicitudSeguimiento.Insertar";
                throw excepcion;
            }
            finally
            {
                comando = null;
                if (conexion != null)
                    if (conexion.State == System.Data.ConnectionState.Open) conexion.Close();
            }
        }

        public void Actualizar(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();
        }

        public void Eliminar(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            conexion.Open();

            comando = new OracleCommand("PKG_SOLICITUD_SEGUIMIENTO.eliminarSolicitudSeguimiento", conexion);
            comando.CommandType = System.Data.CommandType.StoredProcedure;

            try
            {
                OracleParameter parametro0 = new OracleParameter();
                parametro0.OracleDbType = OracleDbType.Varchar2;
                parametro0.Value = ((EntSolicitudSeguimiento)entidad).CveSolicitud;
                parametro0.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro0);

                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = ((EntSolicitudSeguimiento)entidad).CveSeguimiento;
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);

                comando.ExecuteNonQuery();
            }

            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje:  " + exc.Message);
                excepcion.Source = "PerSolicitudSeguimiento.Eliminar";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje:  " + exc.Message);
                excepcion.Source = "PerSolicitudSeguimiento.Eliminar";
                throw excepcion;
            }
            finally
            {
                comando = null;
                if (conexion != null)
                    if (conexion.State == System.Data.ConnectionState.Open) conexion.Close();
            }
        }

        public Entidades.General.IEntidad Obtener(Entidades.General.IEntidad entidad)
        {
            throw new NotImplementedException();
        }

        public List<Entidades.General.IEntidad> ObtenerTodos(Entidades.General.IEntidad entidad)
        {
            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntSolicitudSeguimiento ent = null;
            List<Entidades.General.IEntidad> lista = new List<Entidades.General.IEntidad>();

            try
            {
                comando = new OracleCommand("PKG_SOLICITUD_SEGUIMIENTO.obtenerComentarios", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();

                OracleParameter parametro1 = new OracleParameter();
                parametro1.OracleDbType = OracleDbType.Varchar2;
                parametro1.Value = ((EntSolicitudSeguimiento)entidad).CveSolicitud;
                parametro1.Direction = ParameterDirection.Input;
                comando.Parameters.Add(parametro1);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    ent = new EntSolicitudSeguimiento();
                    ent.CveSolicitud = int.Parse(lector["Cve_Solicitud"] == DBNull.Value ? "0" : lector["Cve_Solicitud"].ToString());
                    ent.CveSeguimiento = int.Parse(lector["cve_seguimiento"] == DBNull.Value ? "0" : lector["cve_seguimiento"].ToString());
                    ent.FechaRegistro = lector["fecha_registro"].ToString();
                    ent.EnviarEmail = lector["enviar_email"].ToString();
                    ent.Comentarios = lector["comentarios"].ToString();

                    lista.Add(ent);
                }
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudSeguimiento.ObtenerTodos";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PerSolicitudSeguimiento.ObtenerTodos";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
            return lista;
        }

        public List<Entidades.General.IEntidad> ObtenerTodos()
        {
            throw new NotImplementedException();
        }

        public List<EntAfectadoDetalleGrafica> ConsultarDetalleGraficaAfectado(string cve_obra, string cadenaBuscar)
        {

            OracleCommand comando = null;
            OracleConnection conexion = new OracleConnection(ConfigurationManager.ConnectionStrings["conString"].ConnectionString);
            OracleDataReader lector = null;
            EntAfectadoDetalleGrafica entidad = null;
            List<EntAfectadoDetalleGrafica> lista = new List<EntAfectadoDetalleGrafica>();
            try
            {

                comando = new OracleCommand("PKG_SOLICITUD_AFECTADO.getAfectadosPorObra", conexion);
                comando.CommandType = System.Data.CommandType.StoredProcedure;

                conexion.Open();
                #region Parametros

                OracleParameter param1 = new OracleParameter();
                param1.OracleDbType = OracleDbType.Varchar2;
                param1.Direction = ParameterDirection.Input;
                param1.Value = cve_obra;
                comando.Parameters.Add(param1);

                OracleParameter cursor = new OracleParameter();
                cursor.OracleDbType = OracleDbType.RefCursor;
                cursor.Direction = ParameterDirection.Output;
                comando.Parameters.Add(cursor);

                #endregion

                lector = comando.ExecuteReader(CommandBehavior.CloseConnection);

                while (lector.Read())
                {
                    entidad = new EntAfectadoDetalleGrafica()
                    {
                        Afectado_Formato = lector["NOMBRE"].ToString() + " " + lector["APELLIDO_P"].ToString() + " " + lector["APELLIDO_M"].ToString(),
                        MontoAfectacionAprobado = lector["monto_formato"].ToString(),
                        NoExpendiente = lector["NO_EXPEDIENTE"].ToString(),
                        Asignado = lector["asignadoA"].ToString(),
                        DescEstatus = lector["ESTATUS"].ToString(),
                        FECHA_OBTENCION_PER_PASO = lector["FECHA_OBTENCION_PER_PASO"].ToString(),
                        FECHA_ENVIO_PERMISO_PASO = lector["FECHA_ENVIO_PERMISO_PASO"].ToString(),
                        F_REGISTRO = lector["FECHA_REGISTRO"].ToString()
                    };

                    lista.Add(entidad);
                }

                return lista;
            }
            catch (OracleException exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PKG_SOLICITUD_AFECTADO.getAfectados";
                throw excepcion;
            }
            catch (Exception exc)
            {
                ApplicationException excepcion = new ApplicationException("Se genero un error de ejecucion del procedimiento almacenado con el siguiente mensaje: \\n" + exc.Message);
                excepcion.Source = "PKG_SOLICITUD_AFECTADO.getAfectados";
                throw excepcion;
            }
            finally
            {
                if (conexion.State == ConnectionState.Open)
                    conexion.Close();

                comando = null;

                if (lector != null)
                    lector.Close();
            }
        }
    }
}
